# Написать программу, которая рисует на RARS Bitmap Display серию квадратов, стороны которых параллельны линиям x=y и x=-y.
# Программа вводит неотрицательное число — цвет фона, которым она закрашивает экран. Далее вводится «полудиагональ» 0 < R ⩽ 50 квадрата.
# Если она нулевая — это конец ввода. Если R ненулевое, вводятся целые координаты X, Y, и цвет, после чего снова водится и проверяется «полудиагональ». Всего квадратов ⩽ 128.
#    Не гарантируется, что квадрат целиком помещается в видеопамяти или вообще находится в ней
#    Параметры Bitmap Display: 2×2; 512×256
#    «Полудиагональ» это расстояние от центра до вершины квадрата. Пример двух квадратов с «полудиагональю» 1 и 2 (если пиксели не квадратные, выглядят как ромбы):
#        ................
#        ..........#.....
#        ..#......###....
#        .###....#####...
#        ..#......###....
#        ..........#.....
#        ................

.include "macros.inc"

.eqv    BASE 0x10010000			# MMIO экрана
.eqv    WIDTH 512
.eqv    HEIGHT 256
.eqv    ALLSIZE 0x8000                	# размер экрана в ячейках
	
.text
.globl  main
main:
	li	s1 128			# Счетчик главного цикла программы
main_loop:
	syscall	5
	bgez	a0 color_square		# Заполним цвет квадрата
	neg	a0 a0
color_square:
	mv	s2 a0
	
	syscall	5			# Заполним R
	beqz	a0 exit
	bgez	a0 semi_diagonal
	neg	a0 a0
semi_diagonal:
	mv	s3 a0
	
	syscall	5			# Заполним X
	bgez	a0 point_X
	neg	a0 a0
point_X:
	mv	s4 a0
	
	syscall	5			# Заполним Y
	bgez	a0 point_Y
	neg	a0 a0
point_Y:
	mv	s5 a0
	
	# Сперва вычислим точку вершины квадрата и будем бежать вниз
	li	t0 BASE
	li	t1 WIDTH
	li	t2 HEIGHT
	
	sub	s7 s5 s3		# Y вершины квадрата
	add	s8 s5 s3		# Y нижней точки
	li	s10 1			# Количество точек в строке
	li	s11 0			# Смещение X
Y_loop:	
	mv	s9 s7			# Offset = Y*DisplayWidth*4/UnitWidth+X*4
	mul	s9 s9 t1		# Y*DisplayWidth
	slli	s9 s9 1			# Y*DisplayWidth*4/UnitWidth
	mv	t6 s10			# Инициализируем цикл по X
	mv	t3 s4
	sub	t3 t3 s11
X_loop:	
	beqz	t6 Y_next
	slli	t4 t3 2			# X*4
	add	t4 s9 t4		# Y*DisplayWidth*4/UnitWidth+X*4
	add	t4 t4 t0		# Offset
	sw	s2 (t4)
	addi	t6 t6 -1
	addi	t3 t3 1
	b	X_loop
Y_next:
	addi	s7 s7 1
	bgt	s7 s5 negative
	addi	s10 s10 2
	addi	s11 s11 1
	b	positive	
negative:
	addi	s10 s10 -2
	addi	s11 s11 -1
positive:	
	ble	s7 s8 Y_loop
	
	addi	s1 s1 -1
	bnez	s1 main_loop

exit:
        syscall 10
